#pragma once
#include "mainANPR.h"
#include "PreprocesamientoForm.h"
#include "utils.h"
#include <msclr\marshal_cppstd.h>

namespace Thesis_3 {

	using namespace msclr::interop;
	using namespace std;
	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	using namespace System::Runtime::InteropServices;

	/// <summary>
	/// Summary for MainForm
	/// </summary>
	public ref class MainForm : public System::Windows::Forms::Form
	{
	public:
		MainForm(void)
		{
			InitializeComponent();
			//
			//TODO: Add the constructor code here
			//
		}

	protected:
		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		~MainForm()
		{
			if (components)
			{
				delete components;
			}
		}
	private: System::Windows::Forms::Button^  botonCargarArchivo;
	private: System::Windows::Forms::Label^  labelNombreArchivo;
	private: System::Windows::Forms::Button^  botonProcesar;
	private: System::String^ nombreArchivo;
	private: System::Windows::Forms::Label^  labelRuta;
	private: System::Windows::Forms::Button^  cerrarVentanas;
	private: System::Windows::Forms::Button^  botonProcesarPasoaPaso;

	private:
		/// <summary>
		/// Required designer variable.
		/// </summary>
		System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		void InitializeComponent(void)
		{
			this->botonCargarArchivo = (gcnew System::Windows::Forms::Button());
			this->labelNombreArchivo = (gcnew System::Windows::Forms::Label());
			this->botonProcesar = (gcnew System::Windows::Forms::Button());
			this->labelRuta = (gcnew System::Windows::Forms::Label());
			this->cerrarVentanas = (gcnew System::Windows::Forms::Button());
			this->botonProcesarPasoaPaso = (gcnew System::Windows::Forms::Button());
			this->SuspendLayout();
			// 
			// botonCargarArchivo
			// 
			this->botonCargarArchivo->Location = System::Drawing::Point(204, 63);
			this->botonCargarArchivo->Name = L"botonCargarArchivo";
			this->botonCargarArchivo->Size = System::Drawing::Size(321, 27);
			this->botonCargarArchivo->TabIndex = 0;
			this->botonCargarArchivo->Text = L"Seleccionar Archivo";
			this->botonCargarArchivo->UseVisualStyleBackColor = true;
			this->botonCargarArchivo->Click += gcnew System::EventHandler(this, &MainForm::botonCargarArchivo_Click);
			// 
			// labelNombreArchivo
			// 
			this->labelNombreArchivo->AutoSize = true;
			this->labelNombreArchivo->Location = System::Drawing::Point(133, 123);
			this->labelNombreArchivo->Name = L"labelNombreArchivo";
			this->labelNombreArchivo->Size = System::Drawing::Size(131, 17);
			this->labelNombreArchivo->TabIndex = 1;
			this->labelNombreArchivo->Text = L"Nombre del archivo";
			// 
			// botonProcesar
			// 
			this->botonProcesar->Enabled = false;
			this->botonProcesar->Location = System::Drawing::Point(218, 204);
			this->botonProcesar->Name = L"botonProcesar";
			this->botonProcesar->Size = System::Drawing::Size(288, 78);
			this->botonProcesar->TabIndex = 2;
			this->botonProcesar->Text = L"Procesar";
			this->botonProcesar->UseVisualStyleBackColor = true;
			this->botonProcesar->Visible = false;
			this->botonProcesar->Click += gcnew System::EventHandler(this, &MainForm::botonProcesar_Click);
			// 
			// labelRuta
			// 
			this->labelRuta->AutoSize = true;
			this->labelRuta->Location = System::Drawing::Point(61, 123);
			this->labelRuta->Name = L"labelRuta";
			this->labelRuta->Size = System::Drawing::Size(42, 17);
			this->labelRuta->TabIndex = 3;
			this->labelRuta->Text = L"Ruta:";
			// 
			// cerrarVentanas
			// 
			this->cerrarVentanas->Enabled = false;
			this->cerrarVentanas->Location = System::Drawing::Point(256, 330);
			this->cerrarVentanas->Name = L"cerrarVentanas";
			this->cerrarVentanas->Size = System::Drawing::Size(206, 26);
			this->cerrarVentanas->TabIndex = 4;
			this->cerrarVentanas->Text = L"Cerrar Ventanas";
			this->cerrarVentanas->UseVisualStyleBackColor = true;
			this->cerrarVentanas->Click += gcnew System::EventHandler(this, &MainForm::cerrarVentanas_Click);
			// 
			// botonProcesarPasoaPaso
			// 
			this->botonProcesarPasoaPaso->Enabled = false;
			this->botonProcesarPasoaPaso->Location = System::Drawing::Point(218, 204);
			this->botonProcesarPasoaPaso->Name = L"botonProcesarPasoaPaso";
			this->botonProcesarPasoaPaso->Size = System::Drawing::Size(290, 78);
			this->botonProcesarPasoaPaso->TabIndex = 5;
			this->botonProcesarPasoaPaso->Text = L"Procesar paso a paso";
			this->botonProcesarPasoaPaso->UseVisualStyleBackColor = true;
			this->botonProcesarPasoaPaso->Click += gcnew System::EventHandler(this, &MainForm::botonProcesarPasoaPaso_Click);
			// 
			// MainForm
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(764, 413);
			this->Controls->Add(this->botonProcesarPasoaPaso);
			this->Controls->Add(this->cerrarVentanas);
			this->Controls->Add(this->labelRuta);
			this->Controls->Add(this->botonProcesar);
			this->Controls->Add(this->labelNombreArchivo);
			this->Controls->Add(this->botonCargarArchivo);
			this->Name = L"MainForm";
			this->Text = L"ANPR";
			this->ResumeLayout(false);
			this->PerformLayout();

		}
#pragma endregion

	private:  void botonCargarArchivo_Click( Object^ /*sender*/, System::EventArgs^ /*e*/ )
			  {
				  OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;

				  openFileDialog1->InitialDirectory = "\\";
				  openFileDialog1->Filter = "PNG files (*.png)|*.png|JPG files (*.jpg)|*.jpg|All files (*.*)|*.*";
				  openFileDialog1->FilterIndex = 2;
				  openFileDialog1->RestoreDirectory = true;
				  if ( openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
				  {
					  if ( (nombreArchivo = openFileDialog1->FileName) != nullptr )
					  {
						  this->labelNombreArchivo->Text = nombreArchivo;
						  this->botonProcesar->Enabled = false;
						  this->botonProcesarPasoaPaso->Enabled = true;
					  } else {
						  this->botonProcesar->Enabled = false;
						  this->botonProcesarPasoaPaso->Enabled = false;
					  }
				  }
			  }
	private: void botonProcesar_Click(Object^  sender, EventArgs^  e) {
				 string nameArch	= (char*)(Marshal::StringToHGlobalAnsi(this->nombreArchivo)).ToPointer();//marshal_as<std::string>(this->nombreArchivo);
				 mainANPR(nameArch);
				 this->cerrarVentanas->Enabled = true;
			 }
	private: System::Void botonProcesarPasoaPaso_Click(System::Object^  sender, System::EventArgs^  e) {
				 string nameArch	= (char*)(Marshal::StringToHGlobalAnsi(this->nombreArchivo)).ToPointer();
				 PreprocesamientoForm^ ventanaPreproc = gcnew PreprocesamientoForm();
				 Mat imagenColor = imread(nameArch,CV_LOAD_IMAGE_COLOR);
				 Mat imagen = imread(nameArch,CV_LOAD_IMAGE_GRAYSCALE);
				 ventanaPreproc->imagen = new Mat();
				 *(ventanaPreproc->imagen) = imagen;
				 ventanaPreproc->imagenColor = new Mat();
				 *(ventanaPreproc->imagenColor) = imagenColor;
				 this->Hide();
				 ventanaPreproc->ShowDialog();
				 this->Show();
			 }
	private: void cerrarVentanas_Click(System::Object^  sender, System::EventArgs^  e) {
				 cerrarTodo();
			 }
	};
}
